package cn.zhentao.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * AI会话实体类 - 管理所有AI功能的会话状态和记忆
 */
@Data
public class AiSession {
    
    /**
     * 会话ID
     */
    private String sessionId;
    
    /**
     * 用户ID
     */
    private Long userId;
    
    /**
     * AI功能类型
     */
    private AiFeatureType featureType;
    
    /**
     * 会话状态
     */
    private SessionState sessionState;
    
    /**
     * 对话历史
     */
    private List<ConversationRecord> conversationHistory;
    
    /**
     * 用户偏好设置
     */
    private UserPreferences userPreferences;
    
    /**
     * 上下文信息
     */
    private Map<String, Object> contextData;
    
    /**
     * 会话统计信息
     */
    private SessionStats sessionStats;
    
    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    
    /**
     * 最后更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    
    /**
     * AI功能类型枚举
     */
    public enum AiFeatureType {
        KNOWLEDGE_QA("知识问答"),
        INFORMATION_QUERY("信息查询"),
        TEXT_GENERATION("文本生成"),
        LANGUAGE_TRANSLATION("语言翻译"),
        EMOTIONAL_COMPANION("情感陪伴"),
        SMART_RECOMMENDATION("智能推荐"),
        HEALTH_MANAGEMENT("健康管理"),
        GAME_ENTERTAINMENT("游戏娱乐");
        
        private final String description;
        
        AiFeatureType(String description) {
            this.description = description;
        }
        
        public String getDescription() {
            return description;
        }
    }
    
    /**
     * 会话状态枚举
     */
    public enum SessionState {
        ACTIVE("活跃"),
        PAUSED("暂停"),
        ENDED("结束");
        
        private final String description;
        
        SessionState(String description) {
            this.description = description;
        }
        
        public String getDescription() {
            return description;
        }
    }
    
    /**
     * 对话记录内部类
     */
    @Data
    public static class ConversationRecord {
        private String userInput;
        private String aiResponse;
        private LocalDateTime timestamp;
        private Map<String, Object> metadata;
        private String sentiment; // 情感分析结果
        private List<String> keywords; // 关键词提取
    }
    
    /**
     * 用户偏好设置内部类
     */
    @Data
    public static class UserPreferences {
        private String language; // 首选语言
        private String responseStyle; // 回复风格：formal, casual, friendly
        private Integer maxHistoryLength; // 最大历史记录长度
        private Boolean enablePersonalization; // 是否启用个性化
        private Map<String, Object> customSettings; // 自定义设置
    }
    
    /**
     * 会话统计信息内部类
     */
    @Data
    public static class SessionStats {
        private Integer totalInteractions; // 总交互次数
        private Integer totalTokensUsed; // 总token使用量
        private Double averageResponseTime; // 平均响应时间
        private LocalDateTime lastActiveTime; // 最后活跃时间
        private Map<String, Integer> topicCounts; // 话题统计
    }
    
    /**
     * 构造函数
     */
    public AiSession() {
        this.conversationHistory = new ArrayList<>();
        this.contextData = new HashMap<>();
        this.sessionState = SessionState.ACTIVE;
        this.createTime = LocalDateTime.now();
        this.updateTime = LocalDateTime.now();
        this.userPreferences = new UserPreferences();
        this.sessionStats = new SessionStats();
        initDefaultPreferences();
        initDefaultStats();
    }
    
    /**
     * 初始化默认偏好设置
     */
    private void initDefaultPreferences() {
        userPreferences.setLanguage("zh-CN");
        userPreferences.setResponseStyle("friendly");
        userPreferences.setMaxHistoryLength(50);
        userPreferences.setEnablePersonalization(true);
        userPreferences.setCustomSettings(new HashMap<>());
    }
    
    /**
     * 初始化默认统计信息
     */
    private void initDefaultStats() {
        sessionStats.setTotalInteractions(0);
        sessionStats.setTotalTokensUsed(0);
        sessionStats.setAverageResponseTime(0.0);
        sessionStats.setLastActiveTime(LocalDateTime.now());
        sessionStats.setTopicCounts(new HashMap<>());
    }
    
    /**
     * 添加对话记录
     */
    public void addConversationRecord(String userInput, String aiResponse, Map<String, Object> metadata) {
        ConversationRecord record = new ConversationRecord();
        record.setUserInput(userInput);
        record.setAiResponse(aiResponse);
        record.setTimestamp(LocalDateTime.now());
        record.setMetadata(metadata != null ? metadata : new HashMap<>());
        record.setKeywords(new ArrayList<>());
        
        conversationHistory.add(record);
        
        // 限制历史记录长度
        if (conversationHistory.size() > userPreferences.getMaxHistoryLength()) {
            conversationHistory.remove(0);
        }
        
        // 更新统计信息
        updateStats();
        this.updateTime = LocalDateTime.now();
    }
    
    /**
     * 更新统计信息
     */
    private void updateStats() {
        sessionStats.setTotalInteractions(sessionStats.getTotalInteractions() + 1);
        sessionStats.setLastActiveTime(LocalDateTime.now());
    }
    
    /**
     * 获取最近的对话历史
     */
    public List<ConversationRecord> getRecentHistory(int count) {
        int size = conversationHistory.size();
        int fromIndex = Math.max(0, size - count);
        return conversationHistory.subList(fromIndex, size);
    }
    
    /**
     * 设置上下文数据
     */
    public void setContextValue(String key, Object value) {
        contextData.put(key, value);
        this.updateTime = LocalDateTime.now();
    }
    
    /**
     * 获取上下文数据
     */
    public Object getContextValue(String key) {
        return contextData.get(key);
    }
    
    /**
     * 清理过期的上下文数据
     */
    public void cleanExpiredContext() {
        // 可以根据需要实现上下文数据的过期清理逻辑
        this.updateTime = LocalDateTime.now();
    }
}
